<!-- 订单列表 -->
<template>
    <div class="order-list">
        <div ref="dgtools" class="filter-container">
            <div class="dgts-row">
                <b class="tr-it">未派总数：{{ modalStatistic.carCount }}辆</b>
                <el-divider direction="vertical"></el-divider>
                <b class="tr-it">订单总价：{{ modalStatistic.totalPrice }}元</b>
                <!-- <label>当前页总价：<span>{{modalStatistic.pageTotalPrice}}元</span></label>
                <label>旅网总价：<span>{{modalStatistic.totalTravelPrepayPrice}}元</span></label>
                <label>自网总价：<span>{{modalStatistic.totalSelfPrepayPrice}}元</span></label> -->
            </div>

            <div class="dgts-fm">
                <el-select v-model="dg.ps.serviceMan" clearable filterable :placeholder="'业务员'" style="width: 90px">
                    <el-option v-for="it in serviceManList" :key="it.baseUserId.uname" :label="it.baseUserId.realName"
                        :value="it.baseUserId.uname">
                    </el-option>
                </el-select>

                <el-select v-model="dg.ps.timeType" :placeholder="'时间类型'" style="width: 100px">
                    <el-option :label="'用车时间'" :value="'1'"></el-option>
                    <el-option :label="'下单时间'" :value="'2'"></el-option>
                    <el-option :label="'续团时间'" :value="'3'"></el-option>
                </el-select>

                <el-date-picker v-model="dg.ps.setime" type="daterange" range-separator="至" start-placeholder="开始日期"
                    end-placeholder="结束日期" style="width: 210px" value-format="yyyy-MM-dd">
                </el-date-picker>

                <el-select v-model="dg.ps.compositor" :placeholder="'排序'" style="width: 80px">
                    <el-option :label="'升序'" :value="'ASC'"></el-option>
                    <el-option :label="'降序'" :value="'DESC'"></el-option>
                </el-select>

                <el-input style="width: 140px" placeholder="订单号" v-model="dg.ps.orderNum">
                </el-input>

                <el-input style="width: 220px" placeholder="行程详情/客户/驾驶员/业务员备注" v-model="dg.ps.routeDetail">
                </el-input>

                <el-select v-model="dg.ps.orderStatus" multiple collapse-tags :placeholder="'订单状态'"
                    style="width: 100px">
                    <el-option :label="'全部状态'" :value="''" @click.native="selAllOrderStatu"></el-option>
                    <el-option v-for="it in mOrderStates" :label="it.name" :key="it.id" :value="it.id">
                    </el-option>
                </el-select>

                <el-select v-model="dg.ps.serviceType" :placeholder="'订单类型'" style="width: 150px">
                    <el-option v-for="it in serviceTypes" :key="it.val" :label="it.label" :value="it.val">
                    </el-option>
                </el-select>

                <el-input style="width: 80px" placeholder="座位数" maxlength="2"
                    onkeyup="this.value = this.value.replace(/^(0+)|[^\d]+/g, '');" v-model="dg.ps.seats">
                </el-input>

                <el-input style="width: 100px" placeholder="车牌号" maxlength="8" v-model="dg.ps.plateNum">
                </el-input>

                <el-input style="width: 130px" placeholder="驾驶员姓名/手机号" maxlength="11" v-model="dg.ps.driver">
                </el-input>

                <template v-if="dg.ftState">
                    <el-select v-model="dg.ps.customId" clearable filterable :remote="true"
                        :remote-method="queryCusPageList" :placeholder="'请搜索选择用车单位'" style="width: 200px">
                        <el-option v-for="it in clientList" :key="it.baseUserId.uname"
                            :label="it.baseUserId.realName + '【' + it.baseUserId.phone + '】【' + it.unitName + '】'"
                            :value="it.id" @click.native="selectCus(it)">
                        </el-option>
                    </el-select>

                    <el-select v-model="dg.ps.dutyMan" clearable filterable :placeholder="'联系人'" style="width: 140px">
                        <el-option v-for="it in dutyManList" :key="it.uname" :label="it.realName" :value="it.uname">
                        </el-option>
                    </el-select>

                    <!-- <el-select 
                    v-model="dg.ps.isExternal" 
                    :placeholder="'是否自营'"
                    style="width: 140px">
                    <el-option :label="'是否自营（全部）'" :value="''"></el-option>
                    <el-option :label="'未外调'" :value="0"></el-option>
                    <el-option :label="'已外调'" :value="1"></el-option>
                </el-select> -->

                    <!-- <el-select 
                    v-model="dg.ps.orderSource" 
                    :placeholder="'订单来源'"
                    style="width: 150px">
                    <el-option
                        v-for="it in orderFromArr"
                        :key="it.id"
                        :label="it.name"
                        :value="it.id">
                    </el-option>
                </el-select> -->

                    <el-select v-model="dg.ps.dataType" :placeholder="'数据类型'" style="width: 80px">
                        <el-option :label="'全部'" value=""></el-option>
                        <el-option :label="'子单'" value="1"></el-option>
                    </el-select>
                </template>

                <ShMoreFt :dgName="dg.dgName" @myclick="onShMoreFt"></ShMoreFt>
            </div>

            <div class="dgts-row">
                <el-button type="primary" icon="el-icon-search" @click="getDgList">搜索</el-button>
                <el-button type="primary" icon="el-icon-plus" @click="addOrderMdState(true)">新增</el-button>
                <el-button type="primary" icon="el-icon-edit" @click="editChildOrder">修改</el-button>
                <el-button type="primary" icon="el-icon-copy-document" @click="copyMainOrder">复制</el-button>
                <!-- <el-button type="primary" icon="el-icon-video-play" @click="setWaiting(0)">设为待定</el-button> -->
                <el-button type="primary" icon="el-icon-delete" @click="delOrder">删除订单</el-button>
                <!-- <el-button type="primary" icon="el-icon-s-tools" @click="setOutTransfer">设为外调</el-button> -->
                <el-button type="primary" icon="el-icon-s-order" @click="setImportTeamOrderListMd({ state: true })">
                    导入订单列表
                </el-button>
            </div>

            <TableSelfSet v-if="dg.columns.length > 0" :tbTitle="'订单列表'" :dgName="dg.dgName" :tbId="dg.tbName"
                :srcCols="dg.srcCols" :columns="dg.columns" @saveSet="saveTbSet" />
        </div>

        <el-table :ref="dg.tbName" :data="dg.list" row-key="orderNum" :height="bodyHeight" border fit
            :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :row-class-name="rowClassName"
            @header-dragend="dragHeader" @selection-change="selRowChange" @expand-change="saveRowExpand">
            <el-table-column fixed="left" type="index" label="编号" width="40" align="center"
                :resizable="false"></el-table-column>
            <el-table-column fixed="left" width="50" align="center" :resizable="false" label="子单"
                v-if="dg.ps.isShowColl != 1"></el-table-column>
            <el-table-column fixed="left" type="selection" width="40" align="center"
                :resizable="false"></el-table-column>
            <fragment v-for="col in dg.columns" :key="col.field">
                <el-table-column :class-name="dg.dgName" :prop="col.field" :label="col.label" :width="col.width">
                    <template slot-scope="{row}">
                        <template v-if="col.field == 'status'">
                            <template v-if="row.isMain">
                                <el-popconfirm v-if="row.status.val == 'PENDING'" title="是否恢复订单？"
                                    @confirm="backWaiting(row)">
                                    <el-button slot="reference" type="primary">待定</el-button>
                                </el-popconfirm>
                                <span v-else>{{ row.status.label }}</span>
                            </template>
                            <template v-else>
                                <el-button v-if="row.status.val == 'NOT_DIS_CAR'" type="primary"
                                    @click.native="disCarMd({ state: true, obj: row })">派车</el-button>
                                <span v-else>{{ row.status.label }}</span>
                            </template>
                        </template>

                        <span v-else-if="col.field == 'routeSimpleName'">
                            <template v-if="row.isMain">
                                <div v-for="(it, i) in row.routeSimpleName" :key="i">{{ it }}</div>
                            </template>
                            <template v-else>{{ row.routeSimpleName }}</template>
                        </span>

                        <span v-else-if="col.field == 'plateNum'">
                            <template v-if="row.isMain">
                                <div v-for="(it, i) in row.plateNum" :key="i">{{ it }}</div>
                            </template>
                            <template v-else>{{ row.plateNum }}</template>
                        </span>

                        <span v-else-if="col.field == 'needSeats'">
                            <template v-if="row.isMain">
                                <div v-for="(it, i) in row.needSeats" :key="i">{{ it }}</div>
                            </template>
                            <template v-else>{{ row.needSeats }}</template>
                        </span>

                        <span v-else-if="col.field == 'needCars'">
                            <template v-if="row.isMain">
                                <div v-for="(it, i) in row.needCars" :key="i">{{ it }}</div>
                            </template>
                            <template v-else>{{ row.needCars }}</template>
                        </span>

                        <span v-else-if="col.field == 'driver'">
                            <template v-if="row.isMain">
                                <div v-for="(it, i) in row.driver" :key="i">{{ it }}</div>
                            </template>
                            <template v-else>{{ row.driver }}</template>
                        </span>

                        <span v-else-if="col.field == 'sdate'">{{ row.stime.split(' ')[0] }}</span>

                        <span v-else-if="col.field == 'stime'">{{ row.stime.substr(11, 5) }}</span>

                        <span v-else-if="col.field == 'edate'">{{ row.etime.split(' ')[0] }}</span>

                        <span v-else-if="col.field == 'etime'">{{ row.etime.substr(11, 5) }}</span>

                        <template v-else-if="col.field == 'routeDetail'">
                            <template v-if="row.isMain">
                                <div v-for="(it, i) in row.routeDetail" :key="i" v-html="it.replace(/@/g, '<br />')">
                                </div>
                            </template>
                            <template v-else>
                                <span v-html="row.routeDetail.replace(/@/g, '<br />')"></span>
                            </template>
                        </template>

                        <template v-else-if="col.field == 'cusNote'">
                            <template v-if="row.isMain">
                                <div v-for="(it, i) in row.cusNote" :key="i" v-html="it"></div>
                            </template>
                            <template v-else>
                                <span v-html="row.cusNote"></span>
                            </template>
                        </template>

                        <template v-else-if="col.field == 'driverNote'">
                            <template v-if="row.isMain">
                                <div v-for="(it, i) in row.driverNote" :key="i" v-html="it"></div>
                            </template>
                            <template v-else>
                                <span v-html="row.driverNote"></span>
                            </template>
                        </template>

                        <template v-else-if="col.field == 'serviceNote'">
                            <template v-if="row.isMain">
                                <div v-for="(it, i) in row.serviceNote" :key="i" v-html="it"></div>
                            </template>
                            <template v-else>
                                <span v-html="row.serviceNote"></span>
                            </template>
                        </template>

                        <template v-else-if="col.field == 'companyName'">
                            <span>{{ row.companyName.split('=')[1] }}-{{ row.companyName.split('=')[2] }}</span>
                        </template>

                        <template v-else-if="col.field == 'dutyBaseUser'">
                            <span>{{ row.dutyBaseUser.split('=')[1] }}-{{ row.dutyBaseUser.split('=')[2] }}</span>
                        </template>

                        <template v-else-if="col.field == 'serviceManName'">
                            <span>{{ row.serviceManName.split('-')[1] }}-{{ row.serviceManName.split('-')[2] }}</span>
                        </template>

                        <span v-else-if="col.field == 'addTime'">{{ row.addTime.substr(0, 16) }}</span>

                        <template v-else>{{ getColVal(row, col.field) }}</template>
                    </template>
                </el-table-column>
            </fragment>
        </el-table>
        <Pagination v-show="dg.total > 0" :total="dg.total" :page.sync="dg.ps.page" :limit.sync="dg.ps.rows"
            @pagination="getDgList" />

        <AddBusinessLeader v-if="md.addBL.state" :state="md.addBL.state" :data="md.addBL.data"
            @getMdState="getAddBLMdState" />

        <AddCus v-if="md.add.state" :state="md.add.state" @getMdState="getAddMdState" @reloadDg="getDgList" />

        <UpdCus v-if="md.upd.state" :state="md.upd.state" :data="md.upd.data" @getMdState="getUpdMdState"
            @reloadDg="getDgList" />

        <AddOrder v-if="md.addOrder.state" :state="md.addOrder.state" :order="md.addOrder.order"
            :allServiceManList="serviceManList" @getMdState="addOrderMdState" @reloadDg="getDgList" />

        <UpdOrder v-if="md.updOrder.state" :state="md.updOrder.state" :order="md.updOrder.order"
            :allServiceManList="serviceManList" @getMdState="updOrderMdState" @reloadDg="getDgList" />

        <DisCar v-if="md.disCar.state" :myData="md.disCar" @myClick="disCarMd" @reloadDg="getDgList" />

        <el-dialog v-el-drag-dialog="{ drag: true, full: false, resize: false }" :visible="importTeamOrderListMd.state"
            :close-on-click-modal="false" @close="importTeamOrderListMd.state = false" :title="`导入订单列表`" width="80%"
            :append-to-body="true">
            <ImportTeamOrderList :myData="importTeamOrderListMd" />
        </el-dialog>

    </div>
</template>

<script>
import DataGridBase from '@/views/mixins/DataGridBase';
import DataGridResize from '@/views/mixins/DataGridResize';
import elDragDialog from '@/directive/el-drag-dialog';
import TableSelfSet from '@/components/TableSelfSet';
import Pagination from '@/components/Pagination';
import ShMoreFt from '@/components/ShMoreFt';

import * as commService from '@/api/services/common.service';
import * as orderService from '@/api/services/order.service';
import * as cusService from '@/api/services/cus.service';

import DisCar from './components/DisCar';
import AddBusinessLeader from '../add-business-leader';
import AddOrder from './add-order';
import UpdOrder from './upd-order';
import ImportTeamOrderList from './import-team-order-list';
import {MessageBox ,message} from 'element-ui'
export default {
    name: 'OrderList',
    mixins: [DataGridBase, DataGridResize],
    directives: { elDragDialog },
    components: {
        TableSelfSet,
        Pagination,
        ShMoreFt,
        AddBusinessLeader,
        AddOrder,
        UpdOrder,
        DisCar,
        ImportTeamOrderList
    },
    data() {
        let cols = [
            { label: '行程简称', field: 'routeSimpleName', width: 150 },
            { label: '订单状态', field: 'status', width: 80 },
            { label: '已派车辆', field: 'plateNum', width: 85 },
            { label: '车型', field: 'needSeats', width: 90 },
            { label: '台数', field: 'needCars', width: 90 },
            { label: '驾驶员', field: 'driver', width: 140 },
            { label: '出发日期', field: 'sdate', width: 85 },
            { label: '出发时间', field: 'stime', width: 70 },
            { label: '到达日期', field: 'edate', width: 85 },
            { label: '到达时间', field: 'etime', width: 70 },
            { label: '行程详情', field: 'routeDetail', width: 550 },
            { label: '客户备注', field: 'cusNote', width: 250 },
            { label: '驾驶员备注', field: 'driverNote', width: 250 },
            { label: '业务员备注', field: 'serviceNote', width: 250 },
            { label: '用车单位', field: 'companyName', width: 125 },
            { label: '联系人', field: 'dutyBaseUser', width: 125 },
            { label: '业务员', field: 'serviceManName', width: 125 },
            { label: '订单价格', field: 'price', width: 70 },
            { label: '已收金额', field: 'alGathPrice', width: 70 },
            { label: '旅网金额', field: 'travelPrepayPrice', width: 70 },
            { label: '自网金额', field: 'selfPrepayPrice', width: 70 },
            { label: '订单号', field: 'orderNum', width: 150 },
            { label: '是否自营', field: 'isExternalName', width: 80 },
            { label: '行程联系人', field: 'routeLink', width: 125 },
            { label: '业务类型', field: 'serviceType', width: 85 },
            { label: '添加时间', field: 'addTime', width: 125 }
        ];

        return {
            resDgList: [], // 原table列表数据（为了复制主订单功能）
            dg: {// 数据列表参数
                dgName: 'dg',
                tbName: 'orderListTb',
                total: 0,
                list: [],
                srcCols: cols,
                columns: [],
                selRows: [],
                rowExpands: [],
                ftState: false,
                ps: { // 过滤参数
                    page: 1, rows: 100,
                    /**业务员 */
                    serviceMan: "",
                    /**用车时间 */
                    timeType: "1",
                    /**排序 默认升序 */
                    compositor: "ASC",
                    /**时间 */
                    setime: [],
                    /**订单号 */
                    orderNum: "",
                    /**行程详情 */
                    routeDetail: "",
                    /**订单状态 */
                    orderStatus: [],
                    /**订单类型 */
                    serviceType: "",
                    /**座位数 */
                    seats: null,
                    /**车牌号 */
                    plateNum: "",
                    /**驾驶员（手机/姓名） */
                    driver: "",
                    /**用车单位 */
                    customId: "",
                    /**联系人 */
                    dutyMan: "",
                    /**是否自营 */
                    isExternal: "",
                    /**订单来源 */
                    orderSource: "",
                    /** 订单类型 */
                    dataType: '',
                    /** 是否显示子单展开按钮 */
                    isShowColl: 0,
                },

            },
            modalStatistic: {// 数组统计订单总价格
                carCount: "0",  // 车辆总数
                totalPrice: "0", // 订单总价
                pageTotalPrice: "0", // 当前页总价
                totalTravelPrepayPrice: "0", // 旅网总价
                totalSelfPrepayPrice: "0" // 自网总价
            },

            md: { // 弹框数据
                addBL: { state: false },
                add: { state: false },
                upd: { state: false },
                // 添加订单-弹框
                addOrder: { state: false, order: null },
                // 修改订单-弹框
                updOrder: { state: false, order: null },
                // 派车-弹框
                disCar: { state: false }
            },

            // 导入车队订单列表-弹框
            importTeamOrderListMd: { state: false },

            serviceTypes: [ // 业务类型
                { val: '', label: '订单类型（全部）' },
                { val: 'COUNTY_SER', label: '县际业务' },
                { val: 'CITY_SER', label: '市际业务' },
                { val: 'PROVINCE_SER', label: '省际业务' },
            ],
            mOrderStates: [ // 主订单状态数组
                { id: "NOT_DIS_CAR", name: "未派车" },
                { id: "NOFINISHED_DIS_CAR", name: "已派车未派完" },
                { id: "FINISHED_DIS_CAR", name: "已完成派车" },
                { id: "PENDING", name: "待定" },
            ],
            orderStates: [ // 订单状态数组
                { id: "", name: "订单状态（全部）" },
                { id: "NOT_DIS_CAR", name: "未派车" },
                { id: "JL_NOT_CONFIRM", name: "未通知" },
                { id: "DRIVER_NOT_CONFIRM", name: "已通知" },
                { id: "DRIVER_CONFIRMED", name: "师傅已确认" },
                { id: "AL_TRAVEL", name: "已出行" },
                { id: "COMPLETED", name: "已完成" },
                // { id: "PENDING", name: "已待定" },
                { id: "CANCELED", name: "已取消" },
                { id: "REFUSED", name: "已拒绝" },
            ],
            orderFromArr: [ // 订单来源数组
                { id: 'PC_COMPANY', name: '电脑端-单位' },
                { id: 'PC_PERSONAL', name: '电脑端-个人' },
                { id: 'MOBILE_COMPANY', name: '移动端-单位' },
                { id: 'MOBILE_PERSONAL', name: '移动端-个人' }
            ],
            serviceManList: [], // 业务员数据列表 
            clientList: [],     // 客户数据列表   
            dutyManList: [],    // 联系人数据列表                   

        }
    },
    created() {
        const that = this;

        // 定义搜索时间默认，开始时间为当前日期，结束时间为开始日期后15天
        if (that.dg.ps.setime.length == 0) {
            that.dg.ps.setime.push(that.U.date2str(new Date(), 'yyyy-MM-dd'));
            that.dg.ps.setime.push(that.U.date2str(new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 7), 'yyyy-MM-dd'));
        }

        that.initTbSetData(that.dg.dgName);

        that.getDgList();
        that.getCompanyAllSalesman();
    },
    methods: {
        /** 选择全部订单状态 */
        selAllOrderStatu() {
            const that = this;

            if (that.dg.ps.orderStatus.length >= 3) {
                // 全选，则取消全选
                that.dg.ps.orderStatus = [];
            } else {
                that.dg.ps.orderStatus = [];
                // 未全选，则全选
                that.mOrderStates.forEach(it => {
                    if (it) that.dg.ps.orderStatus.push(it.id)
                });
            }
        },
        /**
         * 处理列表数据（将线性数据处理为树形数据）
         * @param list 欲处理的数据
         */
        filterDgList(list) {
            const that = this;

            let resList = [], pageTotalPrice = 0;
            list.forEach(it => {
                pageTotalPrice += parseFloat(it.price);

                // 主订单状态-描述
                let mstatusObj = that.mOrderStates.find((os) => { return it.status == os.id; });
                // 所有的行程简称
                let allRouteSimpleName = [];
                // 所有的已派车辆：车牌号数组字
                let allPlateNum = [];
                // 所有的需求车辆座位数
                let allNeedSeats = [];
                // 所有的需求车辆人数
                let allNeedCustomers = [];
                // 所有的需求车辆数
                let allNeedCars = [];
                // 所有的驾驶员
                let allDriver = [];
                // 所有的行程详情
                let allRouteDetail = [];
                // 所有客户备注
                let allCusNote = [];
                // 所有驾驶员备注
                let allDriverNote = [];
                // 所有业务员备注
                let allServiceNote = [];
                // 旅网金额
                let allTravelPrepayPrice = 0;
                // 自网金额
                let allSelfPrepayPrice = 0;

                // 遍历子订单，整理子订单数据
                let children = [];
                it.carOrders.forEach(cit => {
                    // 子订单状态-描述
                    let cstatusObj = that.orderStates.find((os) => { return cit.status == os.id; });
                    // 累加行程简称
                    if (!allRouteSimpleName.find(sr => sr == cit.routeSimpleName)) {
                        allRouteSimpleName.push(cit.routeSimpleName);
                    }
                    // 派单车辆
                    let plateNum = cit.disCarId ? cit.disCarId.plateNum : '';
                    if (plateNum) allPlateNum.push(plateNum);
                    // 驾驶员信息
                    let driver = (cit.disCarId && cit.disCarId.mainDriver) ? (cit.disCarId.mainDriver.uname + '=' + cit.disCarId.mainDriver.realName + '=' + cit.disCarId.mainDriver.phone) : '';
                    if (driver) allDriver.push(`${driver.split('=')[1]}-${driver.split('=')[2]}`);
                    // 累加行程详情
                    let routeDetail = plateNum ? `${plateNum}=${cit.routeDetail}` : `未派车=${cit.routeDetail}`;
                    allRouteDetail.push(routeDetail);
                    // 累加客户备注
                    allCusNote.push(cit.cusNote);
                    // 累加驾驶员备注
                    allDriverNote.push(cit.driverNote);
                    // 累加业务员备注
                    allServiceNote.push(cit.serviceNote);
                    // 累加旅网金额
                    allTravelPrepayPrice += parseFloat(cit.travelPrepayPrice);
                    // 累加自网金额
                    allSelfPrepayPrice += parseFloat(cit.selfPrepayPrice);
                    // 订单类型
                    let serviceType = that.serviceTypes.find((o) => { return cit.serviceType == o.val; });

                    children.push({
                        dgName: it.dgName,
                        id: cit.id,
                        // 订单号
                        orderNum: cit.orderNum,
                        // 是否使用自己的车
                        useSelf: cit.useSelf,
                        // 主订单编号
                        mainOrderNum: cit.mainOrderNum,
                        // 行程简称
                        routeSimpleName: cit.routeSimpleName,
                        // 订单状态
                        status: { val: cit.status, label: cstatusObj ? cstatusObj.name : '' },
                        // 派单车辆：车牌号
                        plateNum: plateNum,
                        // 需求座位数
                        needSeats: cit.needSeats,
                        // 人数
                        customers: cit.customers,
                        // 需求车辆数
                        needCars: 1,
                        // 驾驶员：驾驶员用户名=驾驶员姓名=驾驶员手机号
                        driver: driver ? `${driver.split('=')[1]}-${driver.split('=')[2]}` : '',
                        // 出发时间
                        stime: cit.stime,
                        // 结束时间
                        etime: cit.etime,
                        // 行程详情
                        routeDetail: cit.routeDetail.replace(/@/g, '<br />'),
                        // 客户备注
                        cusNote: cit.cusNote,
                        // 驾驶员备注
                        driverNote: cit.driverNote,
                        // 业务员备注
                        serviceNote: cit.serviceNote,
                        // 用车单位：用户名=姓名=手机号
                        companyName: `${cit.carOrderBase.customId.baseUserId.uname}=${cit.carOrderBase.customId.baseUserId.realName}=${cit.carOrderBase.customId.baseUserId.phone}`,
                        // 联系人：用户名=姓名=手机号
                        dutyBaseUser: `${cit.carOrderBase.dutyBaseUser.uname}=${cit.carOrderBase.dutyBaseUser.realName}=${cit.carOrderBase.dutyBaseUser.phone}`,
                        // 业务员：：用户名=姓名=手机号
                        serviceManName: cit.carOrderBase.serviceMan,
                        // 订单价格
                        price: cit.price,
                        // 已收金额
                        alGathPrice: '',
                        // 旅网金额
                        travelPrepayPrice: cit.travelPrepayPrice == 0 ? '' : cit.travelPrepayPrice,
                        // 自网金额
                        selfPrepayPrice: cit.selfPrepayPrice == 0 ? '' : cit.selfPrepayPrice,
                        // 外调状态
                        isExternalName: cit.useSelf == 0 ? '否' : '是',
                        // 行程联系人
                        routeLink: '',
                        // 业务类型
                        serviceType: serviceType ? serviceType.label : '',
                        // 添加时间
                        addTime: ''
                    });
                });

                // 所有的需求座位数/车辆数 eg：39-6-1,48-2-2,49-2-0
                if (it.needInfo) {
                    let needInfos = it.needInfo.split(',');
                    needInfos.forEach(ni => {
                        let info = ni.split('-');

                        // 累计不同车型的不同需求座位数
                        allNeedSeats.push(`${info[0]}*${info[1]}`);

                        // 累计不同车型的不同需求车辆数
                        allNeedCars.push(`${info[2]}/${info[1]}`);
                    });
                }

                // 主订单-行程详情处理
                let ards = [];
                allRouteDetail.forEach(ard => {
                    let rdIndex = ards.findIndex(rd => rd.split('=')[1] == ard.split('=')[1]);
                    if (rdIndex == -1) {
                        ards.push(ard);
                    } else {
                        let rd = ards[rdIndex];
                        if (rd.split('=')[0] == ard.split('=')[0] && ard.split('=')[0] == '未派车') {
                            ards[rdIndex] = `${ard.split('=')[0]}=${rd.split('=')[1]}`;
                        } else {
                            ards[rdIndex] = `${rd.split('=')[0]}、${ard.split('=')[0]}=${rd.split('=')[1]}`;
                        }
                    }
                });
                // 处理显示
                let newArds = [];
                ards.map((ardIt, i) => {
                    newArds.push(`${i + 1}、（${ardIt.split('=')[0]}）${ardIt.split('=')[1]}`);
                });
                allRouteDetail = newArds;

                // 主订单-客户备注处理
                let notesA = [];
                allCusNote.forEach(cn => {
                    let ai = notesA.findIndex(ait => ait == cn);
                    if (ai == -1) notesA.push(cn);
                });
                allCusNote = notesA;

                // 主订单-驾驶员备注处理
                let notesB = [];
                allDriverNote.forEach(dn => {
                    let bi = notesB.findIndex(bit => bit == dn);
                    if (bi == -1) notesB.push(dn);
                });
                allDriverNote = notesB;

                // 主订单-业务员备注处理
                let notesC = [];
                allServiceNote.forEach(sn => {
                    let ci = notesC.findIndex(cit => cit == sn);
                    if (ci == -1) notesC.push(sn);
                });
                allServiceNote = notesC;

                resList.push({
                    dgName: it.dgName,
                    // 是主订单
                    isMain: true,
                    // 主订单id
                    id: it.id,
                    // 行程简称
                    routeSimpleName: allRouteSimpleName,
                    // 是否使用自己的车
                    // useSelf: '',
                    // 主订单状态
                    status: { val: it.status, label: mstatusObj ? mstatusObj.name : '' },
                    // 所有已派车辆
                    plateNum: allPlateNum,
                    // 需求座位数
                    needSeats: allNeedSeats,
                    // 人数
                    customers: allNeedCustomers,
                    // 需求车辆数
                    needCars: allNeedCars,
                    // 所有驾驶员信息
                    driver: allDriver,
                    // 出发时间
                    stime: it.stime,
                    // 结束时间
                    etime: it.etime,
                    // 所有行程详情
                    routeDetail: allRouteDetail,
                    // 所有客户备注
                    cusNote: allCusNote,
                    // 所有驾驶员备注
                    driverNote: allDriverNote,
                    // 所有业务员备注
                    serviceNote: allServiceNote,
                    // 用车单位：用户名=姓名=手机号
                    companyName: `${it.carOrderBase.customId.baseUserId.uname}=${it.carOrderBase.customId.baseUserId.realName}=${it.carOrderBase.customId.baseUserId.phone}`,
                    // 联系人：用户名=姓名=手机号
                    dutyBaseUser: `${it.carOrderBase.dutyBaseUser.uname}=${it.carOrderBase.dutyBaseUser.realName}=${it.carOrderBase.dutyBaseUser.phone}`,
                    // 业务员：：用户名=姓名=手机号
                    serviceManName: it.carOrderBase.serviceMan,
                    // 主订单价格
                    price: it.price,
                    // 已收金额
                    alGathPrice: it.alGathPrice == 0 ? '' : it.alGathPrice,
                    // 旅网金额
                    travelPrepayPrice: allTravelPrepayPrice == 0 ? '' : allTravelPrepayPrice,
                    // 自网金额
                    selfPrepayPrice: allSelfPrepayPrice == 0 ? '' : selfPrepayPrice,
                    // 主订单号
                    orderNum: it.orderNum,
                    // 外调状态
                    isExternalName: '',
                    // 行程联系人
                    routeLink: it.carOrderBase.routeLink,
                    // 业务类型
                    serviceType: '',
                    // 添加时间
                    addTime: it.carOrderBase.addTime,
                    // 子订单数据
                    children: children,
                });
            });
            // 赋值-当前页总价
            that.modalStatistic.pageTotalPrice = pageTotalPrice;

            // console.log('订单列表', resList);
            return resList;
        },
        /**
         * 处理子集列表数据
         * @param list 欲处理的数据
         */
        filterChildDgList(list) {
            const that = this;

            let resList = [], pageTotalPrice = 0;
            list.forEach(it => {
                it.carOrders.forEach(cit => {
                    pageTotalPrice += parseFloat(cit.price);

                    // 子订单状态-描述
                    let cstatusObj = that.orderStates.find((os) => { return cit.status == os.id; });
                    // 驾驶员信息
                    let driver = (cit.disCarId && cit.disCarId.mainDriver) ? (cit.disCarId.mainDriver.uname + '=' + cit.disCarId.mainDriver.realName + '=' + cit.disCarId.mainDriver.phone) : '';
                    // 订单类型
                    let serviceType = that.serviceTypes.find((o) => { return cit.serviceType == o.val; });

                    resList.push({
                        dgName: it.dgName,
                        id: cit.id,
                        // 订单号
                        orderNum: cit.orderNum,
                        // 是否使用自己的车
                        // useSelf: cit.useSelf,
                        // 主订单编号
                        mainOrderNum: cit.mainOrderNum,
                        // 行程简称
                        routeSimpleName: cit.routeSimpleName,
                        // 订单状态
                        status: { val: cit.status, label: cstatusObj ? cstatusObj.name : '' },
                        // 派单车辆：车牌号
                        plateNum: cit.disCarId ? cit.disCarId.plateNum : '',
                        // 需求座位数
                        needSeats: cit.needSeats,
                        // 人数
                        customers: cit.customers,
                        // 需求车辆数
                        needCars: 1,
                        // 驾驶员：驾驶员用户名=驾驶员姓名=驾驶员手机号
                        driver: driver ? `${driver.split('=')[1]}-${driver.split('=')[2]}` : '',
                        // 出发时间
                        stime: cit.stime,
                        // 结束时间
                        etime: cit.etime,
                        // 行程详情
                        routeDetail: cit.routeDetail.replace(/@/g, '<br />'),
                        // 客户备注
                        cusNote: cit.cusNote,
                        // 驾驶员备注
                        driverNote: cit.driverNote,
                        // 业务员备注
                        serviceNote: cit.serviceNote,
                        // 用车单位：用户名=姓名=手机号
                        companyName: `${cit.carOrderBase.customId.baseUserId.uname}=${cit.carOrderBase.customId.baseUserId.realName}=${cit.carOrderBase.customId.baseUserId.phone}`,
                        // 联系人：用户名=姓名=手机号
                        dutyBaseUser: `${cit.carOrderBase.dutyBaseUser.uname}=${cit.carOrderBase.dutyBaseUser.realName}=${cit.carOrderBase.dutyBaseUser.phone}`,
                        // 业务员：：用户名=姓名=手机号
                        serviceManName: cit.carOrderBase.serviceMan,
                        // 订单价格
                        price: cit.price,
                        // 已收金额
                        alGathPrice: cit.alPayPrice,
                        // 旅网金额
                        travelPrepayPrice: cit.travelPrepayPrice == 0 ? '' : cit.travelPrepayPrice,
                        // 自网金额
                        selfPrepayPrice: cit.selfPrepayPrice == 0 ? '' : cit.selfPrepayPrice,
                        // 外调状态
                        isExternalName: cit.useSelf == 0 ? '否' : '是',
                        // 行程联系人
                        routeLink: cit.carOrderBase.routeLink,
                        // 业务类型
                        serviceType: serviceType ? serviceType.label : '',
                        // 添加时间
                        addTime: cit.carOrderBase.addTime
                    });
                });
            });
            // 赋值-当前页总价
            that.modalStatistic.pageTotalPrice = pageTotalPrice;

            // console.log('子集订单列表', resList);
            return resList;
        },
        /**
         * 获取-主订单分页列表
         */
        getDgList() {
            let that = this, ps = that.U.scopy(that.dg.ps);

            // 参数处理
            if (ps.setime && ps.setime.length == 2) {
                ps.startTime = ps.setime[0];
                ps.endTime = ps.setime[1];
            } else {
                ps.startTime = "";
                ps.endTime = "";
            }

            // 处理订单状态
            if (ps.orderStatus.length == 0) {
                // 未选择，则默认全部（['NOT_DIS_CAR', 'NOFINISHED_DIS_CAR', 'FINISHED_DIS_CAR', 'PENDING']）
                ps.orderStatus = 'NOT_DIS_CAR,NOFINISHED_DIS_CAR,FINISHED_DIS_CAR,PENDING';
            } else {
                ps.orderStatus = ps.orderStatus.join(',');
            }

            let loading = that.U.qloading('数据请求中...');
            orderService.getOrderPageList(ps).then(res => {
                that.U.qclose(loading);

                if (!res || res.code != 1) {
                    that.U.qerror('数据请求失败');
                } else {
                    // 保存-原数据列表，方便查询
                    that.resDgList = res.data;

                    let list = res.data;
                    // 保存-列表数据对象名称
                    list.forEach(it => { it.dgName = that.dg.dgName; });

                    // 统计数据
                    that.modalStatistic = {
                        carCount: res.statics.carCount,
                        totalPrice: res.statics.totalPrice,
                        totalTravelPrepayPrice: res.statics.totalTravelPrepayPrice,
                        totalSelfPrepayPrice: res.statics.totalSelfPrepayPrice
                    };

                    if (ps.dataType == 1) {
                        that.dg.list = that.filterChildDgList(list);
                        that.dg.ps.isShowColl = 1;
                    } else {
                        that.dg.list = that.filterDgList(list);
                        that.dg.ps.isShowColl = 0;
                    }
                    that.dg.total = res.count;
                }
            }).catch(() => { that.U.qclose(loading); });
        },
        // 派车-弹框
        disCarMd(e) {
            // 派车类型（disType）：0-线上派车/线下派车；1-线上派车；2-线下派车；
            let that = this, md = that.md.disCar, U = that.U, rows = that.dg.selRows, disType = 0;

            if (!e.state) {// 关闭弹框
                md.state = e.state;
            } else {// 打开弹框
                if (rows.length > 1) {
                    // 选择了多个子订单，必须是在同一主订单下，且只能线下派单
                    let sons = [], fg = true, oldRow = null, isDiff = -1;
                    for (let i = 0; i < rows.length; i++) {
                        let row = rows[i], num = row.index + 1;

                        // 保存订单
                        sons.push(row);

                        if (!oldRow) oldRow = row;

                        if (row.isMain) {
                            fg = U.qerrorFalse(`编号 ${num} 订单是主订单：主订单不能派车`);
                            break;
                        } else if (row.plateNum) {
                            fg = U.qerrorFalse(`编号 ${num} 订单已派车`);
                            break;
                        } else if (oldRow.mainOrderNum != row.mainOrderNum) {
                            fg = U.qerrorFalse(`编号 ${num} 订单的主订单与其他订单的主订单不一样`);
                            break;
                        } else if (oldRow.routeDetail != row.routeDetail || oldRow.seats != row.seats) {
                            // 行程不一样
                            isDiff = num;
                        }
                    }
                    if (!fg) return;

                    if (isDiff > 0) {// 行程存在不一样，需要提示用户将会进入线下派车
                        U.qconfim(`编号 ${isDiff} 订单的行程与其他订单的行程不一样，点击确定<span class="c-red">进入线下派车</span>？`).then(r => {
                            if (r) {
                                md.orders = sons;
                                // 多条订单时：存在不同行程订单则只能线下派车
                                md.disType = 2;
                                md.state = e.state;
                            }
                        });
                    } else {// 行程一样，直接进入线上派车
                        md.orders = sons;
                        // 多条订单时：存在不同行程订单则只能线上派车；
                        md.disType = 1;
                        md.state = e.state;
                    }
                } else {// 选择了单条子订单，可以线上/线下派单
                    md.orders = [e.obj];
                    md.disType = disType;
                    md.state = e.state;
                }
            }
        },
        /**
         * 获取-单位所有业务员
         */
        getCompanyAllSalesman() {
            const that = this;

            cusService.getCompanyAllSalesman({ staffState: "NORMAL,TRY", deptName: '业务部' }).then(res => {
                if (res && res.code == 1) that.serviceManList = res.data;
            });
        },
        /**
         * 获取-单位客户列表（用于下拉框）
         * @param find 客户手机号/用户名
         */
        queryCusPageList(find) {
            const that = this;

            commService.queryComboCusPageList({ page: 1, rows: 20, find: find }).then(res => {
                if (res && res.code == 1) that.clientList = res.data;
            });
        },
        /**
         * 选择客户-获取联系人
         * @param obj 当前客户对象数据
         */
        selectCus(obj) {
            const that = this;

            that.dg.ps.dutyMan = "";
            orderService.geDutysByCuList({ cusUname: obj.baseUserId.uname }).then(res => {
                if (res && res.code == 1) {
                    that.dutyManList = res.data;
                    // 默认选中第一个
                    if (that.dutyManList.length > 0) that.dg.ps.dutyMan = that.dutyManList[0].uname;
                }
            });
        },
        /**
         * 打开添加弹框
         */
        addOrderMdState(e) {

            // const that = this;

            // 清空因复制赋值的对象
            // that.md.addOrder.order = null;

            // that.md.addOrder.state = e;
            MessageBox.confirm('当前为老系统，添加订单请到新系统！', '提示', {
                confirmButtonText: '前往新系统',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                window.open('https://cba360.com/kcbservice-company/#/login', '_blank', '');
            }).catch(() => {
                this.$message({
                    type: 'info',
                    message: '已取消删除'
                });
            });

        },
        /**
         * 将列表行主订单数据处理成表单数据
         * @param mo 列表行数据主订单对象
         * @returns 处理后的主订单表单数据对象
         */
        getFmMainOrder(mo) {
            const that = this;

            /** 获取当前主订单下所有天数行程数据--begin */
            let dayMps = [];
            mo.carOrders.forEach(it => {
                it.dayMps.forEach(it2 => {
                    let is = dayMps.find(t => `${it2.stime}=${it2.etime}` == `${t.stime}=${t.etime}`);
                    if (!is) dayMps.push(it2);
                });
            });
            /** 获取当前主订单下所有天数行程数据--end */

            /** 选择的主订单的第一条子订单 */
            let o = mo.carOrders[0];

            // 处理添加订单所需要的数据
            let co = {};
            // 订单编号
            co.orderNum = o.orderNum;
            // 是否是主订单
            co.isMain = 1;
            // 团号
            co.groupNum = o.carOrderBase.routeName;
            // 操作员-用户名
            co.operator = o.carOrderBase.dutyBaseUser.uname;
            // 用车客户-用户名
            co.useCarUname = o.carOrderBase.customId.baseUserId.uname;
            // 联系人
            co.routeLink = {
                // 姓名
                name: o.carOrderBase.routeLink.split('-')[0],
                // 手机号
                phone: o.carOrderBase.routeLink.split('-')[1]
            };
            // 业务员
            co.serviceMan = {
                // 用户名
                uname: o.carOrderBase.serviceMan.split('-')[0],
                // 姓名
                name: o.carOrderBase.serviceMan.split('-')[1],
                // 手机号
                phone: o.carOrderBase.serviceMan.split('-')[2]
            };
            // 行程简称（取第一天行程的行程简称）
            co.routeShort = o.routeSimpleName;

            // 天数行程数组
            let dayRoutes = [];
            dayMps.forEach((it, i) => {
                let dr = {};
                // 编号
                dr.no = i + '';
                // 出发日期 2021-01-01
                dr.goDate = it.stime.split(' ')[0];
                // 开始时间 10:30
                dr.stime = it.stime.substr(11, 5);
                // 结束时间 20:00
                dr.etime = it.etime.substr(11, 5);
                // 出发地点
                let spointArr = it.spoint.address.split(' ');
                dr.spoint = {
                    // 区域
                    area: `${it.spoint.city}-${it.spoint.county}`,
                    // 地址详情 成都市 武侯区 天府广场
                    address: it.spoint.address,
                    // 地址简称 天府广场
                    name: spointArr.length > 1 ? spointArr[1] : spointArr[0],
                    // 地点坐标 140.xxxxxx,30.xxxxxx
                    lnglat: it.spoint.lngLat,
                    // 是否是站点 true-是 false-不是
                    isSta: it.spoint.isSta == 1 ? true : false
                };
                // 上午地点数组
                let amPoints = [];
                if (it.morningPoint.length > 0) {
                    it.morningPoint.forEach(amit => {
                        amPoints.push({
                            id: amit.id + '',
                            // 区域
                            area: `${amit.city}-${amit.county}`,
                            // 地址详情 成都市 武侯区 天府广场
                            address: amit.address,
                            // 地址简称 天府广场
                            name: amit.address.split(' ')[1],
                            // 地点坐标 140.xxxxxx,30.xxxxxx
                            lnglat: amit.lngLat,
                            // 是否是站点 true-是 false-不是
                            isSta: amit.isSta == 1 ? true : false
                        });
                    });
                }
                dr.amPoints = amPoints;
                // 午餐地点
                dr.lunchPoint = !it.lunchPoint ? null : {
                    // 区域
                    area: `${it.lunchPoint.city}-${it.lunchPoint.county}`,
                    // 地址详情 成都市 武侯区 天府广场
                    address: it.lunchPoint.address,
                    // 地址简称 天府广场
                    name: it.lunchPoint.address.split(' ')[1],
                    // 地点坐标 140.xxxxxx,30.xxxxxx
                    lnglat: it.lunchPoint.lngLat,
                    // 是否是站点 true-是 false-不是
                    isSta: it.lunchPoint.isSta == 1 ? true : false
                };
                // 下午地点数组
                let pmPoints = [];
                if (it.afternoonPoint.length > 0) {
                    it.afternoonPoint.forEach(pmit => {
                        pmPoints.push({
                            id: pmit.id + '',
                            // 区域
                            area: `${pmit.city}-${pmit.county}`,
                            // 地址详情 成都市 武侯区 天府广场
                            address: pmit.address,
                            // 地址简称 天府广场
                            name: pmit.address.split(' ')[1],
                            // 地点坐标 140.xxxxxx,30.xxxxxx
                            lnglat: pmit.lngLat,
                            // 是否是站点 true-是 false-不是
                            isSta: pmit.isSta == 1 ? true : false
                        });
                    });
                }
                dr.pmPoints = pmPoints;
                // 晚餐地点
                dr.dinnerPoint = !it.dinnerPoint ? null : {
                    // 区域
                    area: `${it.dinnerPoint.city}-${it.dinnerPoint.county}`,
                    // 地址详情 成都市 武侯区 天府广场
                    address: it.dinnerPoint.address,
                    // 地址简称 天府广场
                    name: it.dinnerPoint.address.split(' ')[1],
                    // 地点坐标 140.xxxxxx,30.xxxxxx
                    lnglat: it.dinnerPoint.lngLat,
                    // 是否是站点 true-是 false-不是
                    isSta: it.dinnerPoint.isSta == 1 ? true : false
                };
                // 结束地点
                let epointArr = it.epoint.address.split(' ');
                dr.epoint = {
                    // 区域
                    area: `${it.epoint.city}-${it.epoint.county}`,
                    // 地址详情 成都市 武侯区 天府广场
                    address: it.epoint.address,
                    // 地址简称 天府广场
                    name: epointArr.length > 1 ? epointArr[1] : epointArr[0],
                    // 地点坐标 140.xxxxxx,30.xxxxxx
                    lnglat: it.epoint.lngLat,
                    // 是否是站点 true-是 false-不是
                    isSta: it.epoint.isSta == 1 ? true : false
                };
                // 可换车（已取消）
                dr.changeCar = {
                    // 状态 0-否；1-是；
                    check: 0,
                    // 运价设置
                    transportPrice: '',
                    // 师傅现收
                    remindRouteCash: '',
                    // 其他设置
                    otherFees: '',
                    // 途径高速
                    wayHighSpeed: '',
                    // 行程简称
                    routeShort: ''
                };
                // 临空时间数组
                let emptyTimes = [];
                // 找到指定行程id对应的临空时间对象
                let fts = o.freeTimes.filter(ftit => ftit.dayRouteId == it.id);
                if (fts.length > 0) {
                    fts.forEach((ftit, index) => {
                        emptyTimes.push({
                            no: index + '',
                            stime: ftit.freeStime.substr(11, 5),
                            etime: ftit.freeEtime.substr(11, 5),
                            // 停靠地点
                            stopPoint: {
                                id: (index + 1) + '',
                                // 区域
                                area: `${ftit.stayPoint.city}-${ftit.stayPoint.county}`,
                                // 地址详情 成都市 武侯区 天府广场
                                address: ftit.stayPoint.address,
                                // 地址简称 天府广场
                                name: ftit.stayPoint.address.split(' ')[1],
                                // 地点坐标 140.xxxxxx,30.xxxxxx
                                lnglat: ftit.stayPoint.lngLat,
                                // 是否是站点 true-是 false-不是
                                isSta: ftit.stayPoint.isSta == 1 ? true : false
                            },
                            // 返回地点
                            backPoint: {
                                id: (index + 2) + '',
                                // 区域
                                area: `${ftit.returnPoint.city}-${ftit.returnPoint.county}`,
                                // 地址详情 成都市 武侯区 天府广场
                                address: ftit.returnPoint.address,
                                // 地址简称 天府广场
                                name: ftit.returnPoint.address.split(' ')[1],
                                // 地点坐标 140.xxxxxx,30.xxxxxx
                                lnglat: ftit.returnPoint.lngLat,
                                // 是否是站点 true-是 false-不是
                                isSta: ftit.returnPoint.isSta == 1 ? true : false
                            }
                        });
                    });
                }
                dr.emptyTimes = emptyTimes;

                // 开始/结束地点的航班/车次查询信息 
                let seStaInfo = null;
                if (it.routeStationInfo) {
                    let infoText = '', type = it.routeStationInfo.type,
                        jsType = it.routeStationInfo.isShuttle,
                        num = it.routeStationInfo.num,
                        time = it.routeStationInfo.seltime?.substr(11, 5);

                    if (time && num) {
                        if (type == 1) {// 飞机
                            if (jsType == 1) {// 接
                                infoText = `${num}降落${time}`;
                            } else {// 送
                                infoText = `${num}起飞${time}`;
                            }
                        } else if (type == 2) {// 火车
                            if (jsType == 1) {// 接
                                infoText = `${num}到达${time}`;
                            } else {// 送
                                infoText = `${num}出发${time}`;
                            }
                        }
                    }

                    seStaInfo = {
                        // 航班/车次号
                        flightTrainNo: num,
                        // 降落/起飞/进站/出站时间
                        downUpTime: it.routeStationInfo.seltime,
                        // 查询信息 
                        infoText: infoText,
                        // 站点名称
                        selStaName: it.routeStationInfo.stationName,
                        // 交通类型
                        type: type,
                        // 接送类型
                        jsType: jsType
                    };
                }
                dr.seStaInfo = seStaInfo;

                // 其他地点航班/车次信息数组 D638=2021-04-21 07:10=2=2=火车东站/@G3286=2021-04-21 07:23=2=2=火车东站
                let wpStaInfos = [];
                if (it.otherStationInfo) {
                    let oss = it.otherStationInfo.split('/@');
                    oss.forEach(osit => {
                        let os = osit.split('=');
                        let infoText = '', num = os[0], time = os[1].substr(11, 5), type = os[2], jsType = os[3];
                        if (type == 1) {// 飞机
                            if (jsType == 1) {// 接
                                infoText = `${num}降落${time}`;
                            } else {// 送
                                infoText = `${num}起飞${time}`;
                            }
                        } else if (type == 2) {// 火车
                            if (jsType == 1) {// 接
                                infoText = `${num}到达${time}`;
                            } else {// 送
                                infoText = `${num}出发${time}`;
                            }
                        }

                        wpStaInfos.push({
                            // 航班/车次号
                            flightTrainNo: num,
                            // 降落/起飞/进站/出站时间
                            downUpTime: os[1],
                            // 查询信息 
                            infoText: infoText,
                            // 站点名称
                            selStaName: os[4],
                            // 交通类型
                            type: type,
                            // 接送类型
                            jsType: jsType
                        });
                    });
                }
                dr.wpStaInfos = wpStaInfos;
                // 途径高速
                dr.wayHighSpeed = it.highSpeed;

                dayRoutes.push(dr);
            });
            co.dayRoutes = dayRoutes;
            // 座位数
            co.seats = o.needSeats;
            // 人数
            co.customers = o.customers;
            // 车辆数(交通车只有1辆车)
            co.cars = o.isTrans == 1 ? 1 : mo.needCars;
            // 单车运价(任一一个子订单的运价)
            co.transportPrice = o.price;
            // 其他费用（主订单上的其他费用）
            co.otherFees = mo.otherPrice;
            // 订单总价（所有子订单的所有其他费用+单车运价）
            co.orderTotalPrice = mo.price;
            // 定金
            co.deposit = mo.handSelPrice;
            // 师傅现收
            co.remindRouteCash = mo.remDriverCharge;
            // 途径高速（已移至每日行程中）
            // co.wayHighSpeed = o.highSpeed;
            // 订单业务类型
            co.orderServiceType = mo.serviceType;
            // 行程详情
            let routeDetail = [];
            mo.carOrders.forEach(it => { routeDetail.push(it.routeDetail); });
            co.routeDetail = routeDetail.join('\n');
            // 客户备注
            co.cusNote = o.cusNote;
            // 驾驶员备注
            co.driverNote = o.driverNote;
            // 业务员备注
            co.salesmanNote = o.serviceNote;
            // 是否用自己的车 0-不用；1-用；
            co.useSelfCar = 0;
            // 是否交通车 0-否 1-是
            co.isTrans = o.isTrans;
            // 固定车
            co.fixedCar = o.fixedCar;
            // 固定人
            co.fixedDriver = o.fixedDriver;
            // 派车价格
            co.disPrice = o.disPrice;
            // console.log('主订单', co);
            return co;
        },
        /**
         * 将列表行子订单数据处理成表单数据
         * @param o 列表行数据子订单对象
         * @returns 处理后的子订单表单数据对象
         */
        getFmChildOrder(o) {
            const that = this;

            // 处理添加订单所需要的数据
            let co = {};
            // 订单编号
            co.orderNum = o.orderNum;
            // 派车车辆
            co.plateNum = o.disCarId ? o.disCarId.plateNum : '';
            // 团号
            co.groupNum = o.carOrderBase.routeName;
            // 操作员-用户名
            co.operator = o.carOrderBase.dutyBaseUser.uname;
            // 用车客户-用户名
            co.useCarUname = o.carOrderBase.customId.baseUserId.uname;
            // 联系人
            co.routeLink = {
                // 姓名
                name: o.carOrderBase.routeLink.split('-')[0],
                // 手机号
                phone: o.carOrderBase.routeLink.split('-')[1]
            };
            // 业务员
            co.serviceMan = {
                // 用户名
                uname: o.carOrderBase.serviceMan.split('-')[0],
                // 姓名
                name: o.carOrderBase.serviceMan.split('-')[1],
                // 手机号
                phone: o.carOrderBase.serviceMan.split('-')[2]
            };
            // 行程简称（取第一天行程的行程简称）
            co.routeShort = o.routeSimpleName;
            // 天数行程数组
            let dayRoutes = [];
            o.dayMps.forEach((it, i) => {
                let dr = {};
                // 编号
                dr.no = i + '';
                // 出发日期 2021-01-01
                dr.goDate = it.stime.split(' ')[0];
                // 开始时间 10:30
                dr.stime = it.stime.substr(11, 5);
                // 结束时间 20:00
                dr.etime = it.etime.substr(11, 5);
                // 出发地点
                let spointArr = it.spoint.address.split(' ');
                dr.spoint = {
                    // 区域
                    area: `${it.spoint.city}-${it.spoint.county}`,
                    // 地址详情 成都市 武侯区 天府广场
                    address: it.spoint.address,
                    // 地址简称 天府广场
                    name: spointArr.length > 1 ? spointArr[1] : spointArr[0],
                    // 地点坐标 140.xxxxxx,30.xxxxxx
                    lnglat: it.spoint.lngLat,
                    // 是否是站点 true-是 false-不是
                    isSta: it.spoint.isSta == 1 ? true : false
                };
                // 上午地点数组
                let amPoints = [];
                if (it.morningPoint.length > 0) {
                    it.morningPoint.forEach(amit => {
                        amPoints.push({
                            id: amit.id + '',
                            // 区域
                            area: `${amit.city}-${amit.county}`,
                            // 地址详情 成都市 武侯区 天府广场
                            address: amit.address,
                            // 地址简称 天府广场
                            name: amit.address.split(' ')[1],
                            // 地点坐标 140.xxxxxx,30.xxxxxx
                            lnglat: amit.lngLat,
                            // 是否是站点 true-是 false-不是
                            isSta: amit.isSta == 1 ? true : false
                        });
                    });
                }
                dr.amPoints = amPoints;
                // 午餐地点
                dr.lunchPoint = !it.lunchPoint ? null : {
                    // 区域
                    area: `${it.lunchPoint.city}-${it.lunchPoint.county}`,
                    // 地址详情 成都市 武侯区 天府广场
                    address: it.lunchPoint.address,
                    // 地址简称 天府广场
                    name: it.lunchPoint.address.split(' ')[1],
                    // 地点坐标 140.xxxxxx,30.xxxxxx
                    lnglat: it.lunchPoint.lngLat,
                    // 是否是站点 true-是 false-不是
                    isSta: it.lunchPoint.isSta == 1 ? true : false
                };
                // 下午地点数组
                let pmPoints = [];
                if (it.afternoonPoint.length > 0) {
                    it.afternoonPoint.forEach(pmit => {
                        pmPoints.push({
                            id: pmit.id + '',
                            // 区域
                            area: `${pmit.city}-${pmit.county}`,
                            // 地址详情 成都市 武侯区 天府广场
                            address: pmit.address,
                            // 地址简称 天府广场
                            name: pmit.address.split(' ')[1],
                            // 地点坐标 140.xxxxxx,30.xxxxxx
                            lnglat: pmit.lngLat,
                            // 是否是站点 true-是 false-不是
                            isSta: pmit.isSta == 1 ? true : false
                        });
                    });
                }
                dr.pmPoints = pmPoints;
                // 晚餐地点
                dr.dinnerPoint = !it.dinnerPoint ? null : {
                    // 区域
                    area: `${it.dinnerPoint.city}-${it.dinnerPoint.county}`,
                    // 地址详情 成都市 武侯区 天府广场
                    address: it.dinnerPoint.address,
                    // 地址简称 天府广场
                    name: it.dinnerPoint.address.split(' ')[1],
                    // 地点坐标 140.xxxxxx,30.xxxxxx
                    lnglat: it.dinnerPoint.lngLat,
                    // 是否是站点 true-是 false-不是
                    isSta: it.dinnerPoint.isSta == 1 ? true : false
                };
                // 结束地点
                let epointArr = it.epoint.address.split(' ');
                dr.epoint = {
                    // 区域
                    area: `${it.epoint.city}-${it.epoint.county}`,
                    // 地址详情 成都市 武侯区 天府广场
                    address: it.epoint.address,
                    // 地址简称 天府广场
                    name: epointArr.length > 1 ? epointArr[1] : epointArr[0],
                    // 地点坐标 140.xxxxxx,30.xxxxxx
                    lnglat: it.epoint.lngLat,
                    // 是否是站点 true-是 false-不是
                    isSta: it.epoint.isSta == 1 ? true : false
                };
                // 可换车（已取消）
                dr.changeCar = {
                    // 状态 0-否；1-是；
                    check: 0,
                    // 运价设置
                    transportPrice: '',
                    // 师傅现收
                    remindRouteCash: '',
                    // 其他设置
                    otherFees: '',
                    // 途径高速
                    wayHighSpeed: '',
                    // 行程简称
                    routeShort: ''
                };
                // 临空时间数组（已移至派车操作列表）
                let emptyTimes = [];
                // 找到指定行程id对应的临空时间对象
                let fts = o.freeTimes.filter(ftit => ftit.dayRouteId == it.id);
                if (fts.length > 0) {
                    fts.forEach((ftit, index) => {
                        emptyTimes.push({
                            dayId: ftit.dayRouteId + '',
                            freeId: ftit.id + '',
                            no: index + '',
                            stime: ftit.freeStime.substr(11, 5),
                            etime: ftit.freeEtime.substr(11, 5),
                            // 停靠地点
                            stopPoint: {
                                id: (index + 1) + '',
                                // 区域
                                area: `${ftit.stayPoint.city}-${ftit.stayPoint.county}`,
                                // 地址详情 成都市 武侯区 天府广场
                                address: ftit.stayPoint.address,
                                // 地址简称 天府广场
                                name: ftit.stayPoint.address.split(' ')[1],
                                // 地点坐标 140.xxxxxx,30.xxxxxx
                                lnglat: ftit.stayPoint.lngLat,
                                // 是否是站点 true-是 false-不是
                                isSta: ftit.stayPoint.isSta == 1 ? true : false
                            },
                            // 返回地点
                            backPoint: {
                                id: (index + 2) + '',
                                // 区域
                                area: `${ftit.returnPoint.city}-${ftit.returnPoint.county}`,
                                // 地址详情 成都市 武侯区 天府广场
                                address: ftit.returnPoint.address,
                                // 地址简称 天府广场
                                name: ftit.returnPoint.address.split(' ')[1],
                                // 地点坐标 140.xxxxxx,30.xxxxxx
                                lnglat: ftit.returnPoint.lngLat,
                                // 是否是站点 true-是 false-不是
                                isSta: ftit.returnPoint.isSta == 1 ? true : false
                            }
                        });
                    });
                }
                dr.emptyTimes = emptyTimes;

                // 开始/结束地点的航班/车次查询信息 
                let seStaInfo = null;
                if (it.routeStationInfo) {
                    let infoText = '', type = it.routeStationInfo.type,
                        jsType = it.routeStationInfo.isShuttle,
                        num = it.routeStationInfo.num,
                        time = it.routeStationInfo?.seltime?.substr(11, 5);

                    if (time && num) {
                        if (type == 1) {// 飞机
                            if (jsType == 1) {// 接
                                infoText = `${num}降落${time}`;
                            } else {// 送
                                infoText = `${num}起飞${time}`;
                            }
                        } else if (type == 2) {// 火车
                            if (jsType == 1) {// 接
                                infoText = `${num}到达${time}`;
                            } else {// 送
                                infoText = `${num}出发${time}`;
                            }
                        }
                    }

                    seStaInfo = {
                        // 航班/车次号
                        flightTrainNo: num,
                        // 降落/起飞/进站/出站时间
                        downUpTime: it.routeStationInfo.seltime,
                        // 查询信息 
                        infoText: infoText,
                        // 站点名称
                        selStaName: it.routeStationInfo.stationName,
                        // 交通类型
                        type: type,
                        // 接送类型
                        jsType: jsType
                    };
                }
                dr.seStaInfo = seStaInfo;

                // 其他地点航班/车次信息数组 D638=2021-04-21 07:10=2=2=火车东站/@G3286=2021-04-21 07:23=2=2=火车东站
                let wpStaInfos = [];
                if (it.otherStationInfo) {
                    let oss = it.otherStationInfo.split('/@');
                    oss.forEach(osit => {
                        let os = osit.split('=');
                        let infoText = '', num = os[0], time = os[1].substr(11, 5), type = os[2], jsType = os[3];
                        if (type == 1) {// 飞机
                            if (jsType == 1) {// 接
                                infoText = `${num}降落${time}`;
                            } else {// 送
                                infoText = `${num}起飞${time}`;
                            }
                        } else if (type == 2) {// 火车
                            if (jsType == 1) {// 接
                                infoText = `${num}到达${time}`;
                            } else {// 送
                                infoText = `${num}出发${time}`;
                            }
                        }

                        wpStaInfos.push({
                            // 航班/车次号
                            flightTrainNo: num,
                            // 降落/起飞/进站/出站时间
                            downUpTime: os[1],
                            // 查询信息 
                            infoText: infoText,
                            // 站点名称
                            selStaName: os[4],
                            // 交通类型
                            type: type,
                            // 接送类型
                            jsType: jsType
                        });
                    });
                }
                dr.wpStaInfos = wpStaInfos;
                // 途径高速
                dr.wayHighSpeed = it.highSpeed;

                dayRoutes.push(dr);
            });
            co.dayRoutes = dayRoutes;
            // 座位数
            co.seats = o.needSeats;
            // 人数
            co.customers = o.customers;
            // 车辆数
            co.cars = 1;
            // 单车运价
            co.transportPrice = o.price;
            // 其他费用
            co.otherFees = o.otherPrice;
            // 订单总价
            co.orderTotalPrice = parseFloat(co.transportPrice) + parseFloat(co.otherFees);
            // 定金（子订单没有定金）
            co.deposit = 0;
            // 师傅现收
            co.remindRouteCash = o.remDriverCharge;
            // 途径高速（已移至每日行程中）
            // co.wayHighSpeed = o.highSpeed;
            // 订单业务类型
            co.orderServiceType = o.serviceType;
            // 行程详情
            co.routeDetail = o.routeDetail;
            // 客户备注
            co.cusNote = o.cusNote;
            // 驾驶员备注
            co.driverNote = o.driverNote;
            // 业务员备注
            co.salesmanNote = o.serviceNote;
            // 是否用自己的车 0-不用；1-用；
            co.useSelfCar = o.useSelf;
            // 是否交通车 0-否 1-是
            co.isTrans = o.isTrans;
            // 固定车
            co.fixedCar = o.fixedCar;
            // 固定人
            co.fixedDriver = o.fixedDriver;
            // 派车价格
            co.disPrice = o.disPrice;
            // console.log('子订单', co);
            return co;
        },
        /**
         * 打开修改弹框
         */
        updOrderMdState(e) {
            this.md.updOrder.state = e;
        },
        // 修改子订单
        editChildOrder() {
            const that = this, rows = that.dg.selRows;

            if (rows.length != 1) {
                that.U.qerror('请选择一条数据');
            } else {
                let row = rows[0];
                if (!row.isMain) {
                    // 当前选中的子订单, 当前选择的子订单同级订单数组
                    let co = null, otherOrders = [];
                    for (let i = 0; i < that.resDgList.length; i++) {
                        let mo = that.resDgList[i]; // 当前遍历的主订单

                        otherOrders = [];
                        for (let j = 0; j < mo.carOrders.length; j++) {
                            let c = mo.carOrders[j]; // 当前遍历的子订单

                            if (row.id == c.id) {
                                co = c;
                            } else {
                                if (c.isTrans == 1) {
                                    // 交通车，不保存已派车的订单
                                    if (!c.disCarId || !c.disCarId.plateNum) otherOrders.push(that.getFmChildOrder(c));
                                } else {
                                    // 保存同级子订单至数组中
                                    otherOrders.push(that.getFmChildOrder(c));
                                }
                            }
                        }

                        if (co) break; // 跳出外层循环
                    }

                    if (!co) {
                        that.U.qerror(`选中的子订单已不存在，请重新选择！`);
                    } else if (co.isSplit == 1) {
                        that.U.qerror(`选中的子订单已拆分，不能修改！`);
                    } else {
                        that.md.updOrder.order = that.getFmChildOrder(co);
                        // 除当前选中的子订单之外的兄弟订单数组
                        that.md.updOrder.order.otherOrders = otherOrders;
                        // 打开修改订单弹框
                        that.md.updOrder.state = true;
                    }
                } else {
                    that.U.qerror(`选中的订单不是子订单，请重新选择！`);
                }
            }
        },
        // 复制主订单
        copyMainOrder() {
            const that = this, rows = that.dg.selRows;

            if (rows.length != 1) {
                that.U.qerror('请选择一条数据');
            } else {
                let row = rows[0];
                if (!row.isMain) {
                    that.U.qerror(`选中订单不是主订单，请重新选择！`);
                } else if (row.isSplit == 1) {
                    that.U.qerror(`选中的主订单已被拆分，不能复制！`);
                } else {
                    // 找到当前选择数据的原数据订单对象
                    let mo = that.resDgList.find(os => { return os.id == row.id; });
                    if (!mo) {
                        that.U.qerror(`选中的主订单已不存在，请重新选择！`);
                        return;
                    }

                    that.md.addOrder.order = that.getFmMainOrder(mo);
                    // 设置一个标志参数
                    that.md.addOrder.order.isCopy = 1;
                    // 打开添加订单弹框
                    that.md.addOrder.state = true;
                }
            }
        },
        /**
         * 订单设置待定
         */
        setWaiting() {
            const that = this, rows = that.dg.selRows;

            if (rows.length == 0) {
                that.U.qerror('请至少选择一条数据');
            } else {
                let ids = [], noMainIds = [];
                rows.forEach((it, i) => {
                    // 验证：选中的订单必须是主订单
                    if (!it.isMain) {
                        noMainIds.push(i + 1);
                    } else {
                        ids.push(it.id);
                    }
                });
                if (noMainIds.length > 0) {
                    that.U.qerror(`选中的第${noMainIds.join('、')}条订单不是主订单，请重新选择！`);
                    return;
                }

                that.U.qconfim(`确定将所选择的主订单<span class="c-red">设置为待定状态</span>？`).then(r => {
                    if (r) {
                        let loading = that.U.qloading('设置中，请稍后...');
                        let ps = { ids: ids.join(',') };// 订单号：多个用逗号分隔
                        orderService.setMainOrderWaiting(ps).then(res => {
                            that.U.qclose(loading);

                            if (!res || res.code != 1) {
                                that.U.qerror(res.msg);
                            } else {
                                that.U.qsuccess(res.msg);

                                // 调用方法-重新加载
                                that.getDgList();
                            }
                        });
                    }
                });
            }
        },
        /**
         * 订单恢复待定
         * @param row 当前行数据
         */
        backWaiting(row) {
            const that = this;

            let loading = that.U.qloading('恢复中，请稍后...');
            orderService.setRecoverMainOrderWaiting({ ids: row.id }).then(res => {
                that.U.qclose(loading);

                if (!res || res.code != 1) {
                    that.U.qerror(res.msg);
                } else {
                    that.U.qsuccess(res.msg);

                    // 调用件方法-重新加载
                    that.getDgList()
                }
            });
        },
        // 删除主订单/子订单
        delOrder() {
            const that = this, U = that.U, rows = that.dg.selRows;

            if (rows.length != 1) {
                U.qerror(`您选择了${rows.length}条数据，请选择一条数据`);
            } else {
                // let ids = [], fg = true;
                // for(let i = 0; i < rows.length; i++){
                //     let row = rows[i];
                //     if(!row.isMain){
                //         that.U.qerror(`选中的第${i+1}条订单不是主订单，请重新选择！`);
                //         fg = false;
                //         break;
                //     }else if(row.status.val != 'NOT_DIS_CAR' && row.status.val != 'PENDING'){
                //         that.U.qerror(`选中的第${i+1}条主订单：只有“未派车”和“待定”的订单才能删除`);
                //         fg = false;
                //         break;
                //     }else{
                //         ids.push(row.id);
                //     }
                // }
                // if(!fg) return;

                let row = rows[0];
                if (row.isMain == 1) {// 删除主订单
                    if (row.status.val != 'NOT_DIS_CAR') {
                        U.qerror(`只有“未派车”的订单才能删除`);
                    } else {
                        U.qconfim(`确定<span class="c-red">删除所选主订单</span>？`).then(r => {
                            if (r) {
                                let loading = U.qloading('提交中，请稍后...');
                                orderService.delMainOrder({ ids: row.id }).then(res => {
                                    U.qclose(loading);

                                    if (!res || res.code != 1) {
                                        U.qerror(res.msg);
                                    } else {
                                        U.qsuccess(res.msg);

                                        // 调用方法-重新加载
                                        that.getDgList();
                                    }
                                });
                            }
                        });
                    }
                } else {// 删除子订单
                    if (row.status.val != 'NOT_DIS_CAR') {
                        U.qerror(`只有“未派车”的订单才能删除`);
                    } else {
                        U.qconfim(`确定<span class="c-red">删除所选子订单</span>？`).then(r => {
                            if (r) {
                                let loading = U.qloading("请稍后...");
                                orderService.delChildOrder({ orderNum: row.orderNum }).then((res) => {
                                    U.qclose(loading);

                                    if (!res || res.code != 1) {
                                        U.qerror(res.msg);
                                    } else {
                                        U.qsuccess(res.msg);

                                        // 调用方法-重新加载
                                        that.getDgList();
                                    }
                                });
                            }
                        });
                    }
                }
            }
        },
        // /** 设为外调 */
        // setOutTransfer(){
        //     const that = this, U = that.U, rows = that.dg.selRows;

        //     if(rows.length == 0){
        //         U.qerror('请至少选择一条数据');
        //     }else{
        //         let ids = [], fg = true;
        //         for(let i = 0; i < rows.length; i++){
        //             let row = rows[i];
        //             if(row.isMain){
        //                 fg = U.qerrorFalse(`选中的第${i+1}条订单是主订单，请选择子订单！`);
        //                 break;
        //             }else if(row.useSelf == 0){
        //                 fg = U.qerrorFalse(`选中的第${i+1}条子订单已设为外调，请取消该条订单选择！`);
        //                 break;
        //             }else{
        //                 ids.push(row.id);
        //             }
        //         }
        //         if(!fg) return;

        //         U.qconfim(`确定将所选子订单<span class="c-red">设为外调</span>？`).then(r => {
        // if(r){
        //             let loading = U.qloading('提交中，请稍后...');
        //             let ps = {idList: ids};// 订单id：eg:[1,2]

        //             orderService.setOutTransfer(ps).then(res => {
        //                 U.qclose(loading);

        //                 if(!res || res.code != 1){
        //                     U.qerror(res.msg);
        //                 }else {
        //                     U.qsuccess(res.msg);

        //                     // 调用方法-重新加载
        //                     that.getDgList();
        //                 }
        //             });
        // }
        //         });
        //     }
        // },

        // 打开/关闭-导入车队订单列表-弹框
        setImportTeamOrderListMd(e) {
            const that = this, md = that.importTeamOrderListMd;

            md.state = e.state;
        },

    }
}
</script>

<style scoped></style>
